// async 返回值---------------------------------------------------
function delay (time) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve()
    }, time)
  })
}

// async函数任何时候都会返回一个Promise对象
// async直接返回的值会成为then方法回调函数的参数。
// async function foo () {
//   return 123
// }
// foo().then(res => {
//   console.log('foo', res)
// })

// async函数返回的Promise对象，必须等到内部所有await命令的Promise对象执行完，才会发生状态改变

// async function bar () {
//   await delay(2000)
//   return 123
// }
// bar().then(res => {
//   console.log('bar', res)
// })

// 正常情况下，await命令后面是一个Promise对象。如果不是，会被转成一个立即resolve的Promise对象
// async function baz () {
//   return await 123
// }

// baz().then(res => {
//   console.log('baz', res)
// })

// async 错误处理---------------------------------------------------------------------------
// await命令后面的Promise对象如果变为reject状态，且未被捕获，则reject的参数会被catch方法的回调函数接收到
// async没有return也会被catch方法的回调函数接收到错误
// async function f() {
//   await Promise.reject('出错了');
// }

// f().then(v => console.log(v)).catch(e => console.log(e))


// try catch 捕获错误
// async function f() {
//   try {
//     await Promise.reject('出错了');
//   } catch (e) {
//     console.log('e', e)
//   }
// }

// f().then(v => console.log(v)).catch(e => console.log(e))

// Promise对象后面再跟一个catch捕获错误
async function f() {
  let res = await Promise.reject('出错了').catch(err => {
    console.log('err', err)
  });
}

f().then(v => console.log(v)).catch(e => console.log(e))

